package Structural.Proxy.dynamicProxy.Jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

//代理类
//JDK动态代理
public class MyInvocationHandler implements InvocationHandler {

//    委托类：被代理的对象
    //代理类持有一个委托类的对象引用
    private Object delegate;

    public MyInvocationHandler(Object delegate){
        this.delegate = delegate;
    }

//    在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时，将在调用处理程序上调用此方法。

//    参数：
//    proxy - 在其上调用方法的代理实例
//    method - 对应于在代理实例上调用的接口方法的 Method 实例。
//             Method 对象的声明类将是在其中声明方法的接口，该接口可以是代理类赖以继承方法的代理接口的超接口。
//    args - 包含传入代理实例上方法调用的参数值的对象数组，如果接口方法不使用参数，则为 null。
//           基本类型的参数被包装在适当基本包装器类（如 java.lang.Integer 或 java.lang.Boolean）的实例中。
//    返回：
//         从代理实例的方法调用返回的值。
//         如果接口方法的声明返回类型是基本类型，则此方法返回的值一定是相应基本包装对象类的实例；否则，它一定是可分配到声明返回类型的类型。
//         如果此方法返回的值为 null 并且接口方法的返回类型是基本类型，则代理实例上的方法调用将抛出 NullPointerException。
//         否则，如果此方法返回的值与上述接口方法的声明返回类型不兼容，则代理实例上的方法调用将抛出 ClassCastException。
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//利用反射机制将请求分派给委托类处理。Method的invoke返回Object对象作为方法执行结果。
        //        预处理
        preRequest();
        method.invoke(delegate,args);
//        后续处理
        postRequest();
        return null;
    }

    public void preRequest()
    {
        System.out.println("访问真实主题之前的预处理。");
    }
    public void postRequest()
    {
        System.out.println("访问真实主题之后的后续处理。");
    }
}
